package com.epalmpay.service.weixin;


import com.epalmpay.entity.Wallet;
import com.epalmpay.exception.ApplicationException;
import com.epalmpay.payplat.result.PayResult;
import com.epalmpay.payplat.result.PayTransferResult;
import com.epalmpay.payplat.result.PayWithdrawalResult;
import com.epalmpay.payplat.result.PayWxPayResult;
import com.epalmpay.util.Response;

public interface IWalletService {
   
	
	 /**
	  * 更改锁定金额
	  * @param id  id 会员主键id   代理商主键id 门店主键id 
	  * @param type  类型   1表示会员 2表示代理商 3表示门店
	  * @param tranAmt  交易金额 单位分 为正表示增加 为负表示减少
	  * @param isWithdraw  是否可提现金额 1表示可提现 0表示不可提现
	  * @param day    	锁定时间 单位 天
	  * @param orderId  订单号
	  * @return
	  * @throws ApplicationException
	  */
    public Response updateLockedAmount(String id,String type,String tranAmt,String isWithdraw,Integer day,String orderId) throws ApplicationException ;
    
   /**
    * 余额变动
    * @param virtualCard  支付平台用户id
    * @param payGroupCode 支付平台机构号
    * @param userId  用户id
    * @param tranAmt    交易金额 单位分 为正表示增加 为负表示减少
    * @param isWithdraw   是否可提现金额 1表示可提现 0表示不可提现
    * @param day    锁定时间 单位 天
    * @return
    * @throws ApplicationException
    */
    public PayResult updateUserLockedAmount(String virtualCard,String payGroupCode,Long userId,String tranAmt,String isWithdraw,Integer day,String orderId) throws ApplicationException ;
    
    
    /**
     * 微信会员钱包充值 预下单
     * @param virtualCard
     * @param payGroupCode
     * @param userId
     * @param OrgOrderNum
     * @param tranAmt
     * @param mchCreateIp
     * @param wxAppid
     * @param openid
     * @param isWithdraw 1表示可提现  0表示不可提现
     * @return
     * @throws ApplicationException
     */
    public PayWxPayResult updateRecharge(String virtualCard,String payGroupCode,Long userId,String OrgOrderNum, String tranAmt,
			String mchCreateIp, String wxAppid, String openid, String isWithdraw) throws ApplicationException ;
    
    /**
     * 微信钱包充值 回调确认
     * @param memberId
     * @param tranAmt  充值金额
     * @param sendtranAmt  赠送的金额
     * @param isWithdraw  1表示可提现  0表示不可提现
     * @return
     * @throws ApplicationException
     */
    public Boolean updateRechargeNotify(Long memberId,Integer tranAmt,Integer sendtranAmt,String isWithdraw,String orderId) throws ApplicationException ;
    
    
    /**
     * 用户余额查询
     * @param virtualCard   支付平台用户id
     * @param payGroupCode  支付平台商户id
     * @param userId        2.0用户id
     * @return
     * @throws ApplicationException
     */
    public Wallet selectwallet(String virtualCard,String payGroupCode,Long userId) throws ApplicationException ;
    
    /**
     *  商户余额查询
     * @param virtualCard   支付平台用户id
     * @param payGroupCode  支付平台商户id
     * @param userId        2.0用户id
     * @return
     * @throws ApplicationException
     */
    public Wallet selectShopWallet(String virtualCard,String payGroupCode,Long userId) throws ApplicationException ;
    
    
    /**
     * 消费
     * @param virtualCard   支付平台用户id
     * @param payGroupCode  支付平台商户id
     * @param userId        2.0用户id
     * @param tranAmt       交易金额
     * @param orgOrderNum   订单号
     * @param payPwd  解密 明文 密码
     * @param MerchantId  台卡交易填写商户号  其他交易为空
     * @param orderId 订单号
     * @return
     * @throws ApplicationException
     */
    public PayResult updatePayConsumption(String virtualCard,String payGroupCode,Long userId,Integer tranAmt,String orgOrderNum,String payPwd,String MerchantId,String orderId) throws ApplicationException ;
    
    
    /**
     * 消费 撤销交易  未完成
     * @param virtualCard 支付平台用户id
     * @param payMerchantCode  支付平台门店id
     * @param payGroupCode     支付平台商户id
     * @param userId   2.0用户id
     * @param tranAmt
     * @param orgOrderNum
     * @param payPwd
     * @param MerchantId
     * @return
     * @throws ApplicationException
     */
    public PayResult updateUnPayConsumption(String virtualCard,String payMerchantCode,String payGroupCode,Long userId,Integer tranAmt,String orgOrderNum,String payPwd,String MerchantId) throws ApplicationException ;
    
    
    
    /**
     * 转账
     * @param virtualCard  支付平台转出用户id
     * @param toVirtualCard 支付平台转入用户id
     * @param toUserName 转入姓名
     * @param payGroupCode     支付平台商户id
     * @param userId   2.0用户id 转出  
     * @param toUserId  转入
     * @param tranAmt   交易金额
     * @param fee       支付平台转出 用户 手续费
     * @param orgOrderNum
     * @param payPwd
     * @return
     * @throws ApplicationException
     */
    public PayTransferResult updateConsumptionTransfer(String virtualCard,String toVirtualCard,String toUserName,
    		String payGroupCode,Long userId,Long toUserId,Integer tranAmt,Integer fee,String orgOrderNum,String payPwd) throws ApplicationException;
    
    
    /**
     * 提现 到指定 银行卡 无需审核
     * @param virtualCard   支付平台转出用户id
     * @param payGroupCode  支付平台转入用户id
     * @param userId    2.0用户id
     * @param tranAmt   提现金额
     * @param orderId  订单号
     * @param payPwd   支付密码
     * @param cardNum  卡号
     * @param bankIntegral  开户行行号
     * @param idName        持卡人姓名
     * @param issuerBankName  发卡行名称
     * @param fee   手续费
     * @return
     * @throws ApplicationException
     */
    
    public PayWithdrawalResult updateBankWithdrawal(String virtualCard, String payGroupCode, Long userId, Integer tranAmt,
			String orderId, String payPwd, String cardNum, String bankIntegral, String idName, String issuerBankName,Integer fee) throws ApplicationException ;
    
    
    
    /**
     * 子商户申请提现
     * @param virtualCard
     * @param payGroupCode
     * @param userId
     * @param tranAmt 提现金额
     * @param orgOrderNum
     * @return
     * @throws ApplicationException
     */
    public PayTransferResult updateMerchantWithsDraw(String virtualCard, String payGroupCode, Long userId, Integer tranAmt,
			String orderId) throws ApplicationException ;
    
    
    /**
     * 提现锁定金额释放 一般回调使用
     * @param orderId 订单号
     * @param payerId 支付者会员id
     * @param flag 是否提现成功
     * @param type 1 会员  2 代理商  3门店
     * @return
     * @throws ApplicationException
     */
    public Boolean updateBankWithdrawalNotify(String orderId,Long payerId,Boolean flag,Integer type) throws ApplicationException ;
    
    
    
    /**
     * 预授权提现
     * @param virtualCard
     * @param payGroupCode
     * @param userId
     * @param tranAmt
     * @param orgOrderNum
     * @param payPwd
     * @param fee
     * @return
     * @throws ApplicationException
     */
    public PayResult updateWarrantWithdrawal(String virtualCard, String payGroupCode, Long userId, Integer tranAmt,
			String orderId, String payPwd, Integer fee) throws ApplicationException ;

    /**
     * pos 钱包支付更新钱包信息
     * @param virtualCard
     * @param payGroupCode
     * @param userId
     * @param realAmount
     * @param orderNo
     * @return
     */
    PayResult updateWallInforPosWallPay(String virtualCard, String payGroupCode, Long userId, Integer realAmount, String orderNo) throws ApplicationException;

}
